package com.example.concurrent.chapter10;

/**
 * @author Liuqz
 * @date 2018/11/25 14:42
 */
public class LoadSimpleClass {

    /**
     * 根据JVM规范的约定,在类的加载过程中,所有参与的类加载器,即使没有亲自加载过该类,也都会被标识为该类的初始类加载器.
     *
     * 比如java.lang.String首先经过了BrokerDelegateClassLoader类加载器,依次又经过了系统类加载器,扩展类加载器,根类加载器,
     * 这些类加载器都是java.lang.String的初始加载器,JVM会在每一个类加载器维护的列表中添加该class类型
     *
     * BrokerDelegateClassLoader    -->     系统类加载器     -->     扩展类加载器     -->     根类加载器
     *       String.class                  String.class           String.class          String.class
     *    SimpleClass.class
     *
     *
     *  类的卸载 : JVM规定了一个Class只有满足以下三个条件的时候才会被GC回收,也就是类的卸载
     *          1.该类的所有实例已经被GC,比如Simple.class的所有Simple实例都被回收掉
     *          2.加载该类的ClassLoder实例被回收
     *          3.该类的class实例没有在其他地方被引用
     *
     * @param args
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        BrokerDelegateClassLoader classLoader = new BrokerDelegateClassLoader("G\\classloader2");
        Class<?> aClass = classLoader.loadClass("com.example.concurrent.chapter10.SimpleClass");
        System.out.println(classLoader.getParent());
        aClass.newInstance();
    }
}
